package com.macro.mall.common.api.util;


import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * 日期时间工具类
 *
 * @author rainn
 * @date 2019-01-10
 */
public class LocalDateTimeUtils {

    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
    public static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";

    public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 格式化日期时间
     *
     * @param dateTime 日期时间
     * @param pattern  格式,默认为yyyy-MM-dd HH:mm:ss
     * @return 格式化日期时间
     */
    public static String formatDateTime(LocalDateTime dateTime, String pattern) {
        if (StringUtils.isBlank(pattern)) {
            pattern = DEFAULT_PATTERN;
        }

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);

        return dateTime.format(dateTimeFormatter);
    }

    /**
     * 格式化日期时间,如果dateTime为空，则返回1970-01-01T00:00:00
     *
     * @param dateTime 日期时间
     * @param pattern  格式,默认为yyyy-MM-dd HH:mm:ss
     * @return 格式化的日期时间
     */
    public static String formatDateTimeSafe(LocalDateTime dateTime, String pattern) {
        if (dateTime == null) {
            dateTime = LocalDateTime.of(1970, 1, 1, 0, 0, 0);
        }
        return formatDateTime(dateTime, pattern);
    }

    /**
     * 持续时间转友好提示
     *
     * @param duration 持续时间
     * @return 友好提示
     */
    public static String durationToFriendly(Duration duration) {
        long totalSeconds = duration.getSeconds();

        int secondsInOneMinute = 60;
        int secondsInOneHour = 3600;
        int secondsInOneDay = 3600 * 24;

        long days = totalSeconds / secondsInOneDay;
        long lastSeconds = totalSeconds % secondsInOneDay;

        long hours = lastSeconds / secondsInOneHour;
        long minutes = (lastSeconds % secondsInOneHour) / secondsInOneMinute;

        StringBuilder stringBuilder = new StringBuilder();
        if (days > 0) {
            stringBuilder.append(days + "天 ");
        }
        if (hours > 0) {
            stringBuilder.append(hours + "小时 ");
        }
        stringBuilder.append(String.format("%s分钟", minutes));

        return stringBuilder.toString();
    }

    /**
     * 获取本月的第一天
     *
     * @return 本月第一天的 00:00:00
     */
    public static LocalDateTime getFirstDateOfMonth() {
        LocalDateTime now = LocalDateTime.now();
        return getFirstDateOfMonth(now);
    }

    /**
     * 获取指定日期所在月份的第一天
     *
     * @param date 指定日期
     * @return 指定日期所在月份的第一天 00:00:00
     */
    public static LocalDateTime getFirstDateOfMonth(LocalDateTime date) {
        return LocalDateTime.of(date.getYear(), date.getMonth(), 1, 0, 0, 0);
    }

    /**
     * 获取本月的最后一天
     *
     * @return 本月第一天的 23:59:59
     */
    public static LocalDateTime getLastDateOfMonth() {
        LocalDateTime now = LocalDateTime.now();
        return getLastDateOfMonth(now);
    }

    /**
     * 获取指定日期所在月份的最后一天
     *
     * @return 指定日期所在月份的最后一天的 23:59:59
     */
    public static LocalDateTime getLastDateOfMonth(LocalDateTime date) {
        LocalDateTime lastDateInMonth = getFirstDateOfMonth(date).plusMonths(1).plusDays(-1);
        return LocalDateTime.of(lastDateInMonth.toLocalDate(), LocalTime.MAX);
    }
}
